#include "app_message.h"
#include "stdlib.h"
#include "string.h"
#include "cJSON.h"
#include "app_common.h"
#include "log.h"


/**
 * @brief 负责 字节数组 转换为 json字符串
 * @param bytes_data 字节数组
 * @param bytes_len 字节数组长度
 * @return json字符串
 */
char  *app_message_bytes2json(char *bytes_data, int bytes_len)
{
	//1  从字节数组中拆解出数据 
	char conn_type=bytes_data[0];//连接类型 
	int id_len=bytes_data[1];
	int msg_len=bytes_data[2];
	char id[id_len];
	char msg[msg_len];

	memcpy(id,bytes_data+3,id_len);
  	memcpy(msg,bytes_data+3+id_len,msg_len);

	char *id_hexstr=app_common_bytes2hexstr(id,id_len);
	char *msg_hexstr=app_common_bytes2hexstr(msg,msg_len);

	//2 把对应的数值组合为一个json字符串
	cJSON *root = cJSON_CreateObject();
	cJSON_AddNumberToObject(root, "conn_type", conn_type);
	cJSON_AddStringToObject(root, "id", id_hexstr);	
	cJSON_AddStringToObject(root, "msg", msg_hexstr);

	char *json_str = cJSON_PrintUnformatted(root);

	cJSON_Delete(root);
	return json_str;

}



/**
 * @brief 负责把json字符串 转换为 字节数组
 * @param json_str json字符串
 * @param bytes_buff 字节数组缓冲区(空 已开辟空间)
 * @param buff_len 字节数组c缓冲区长度
 * @return 字节数组转换后实际长度
 */
int app_message_json2bytes(char *json_str, char *bytes_buff, int buff_len)
{
	log_info("需要转 json_str=%s",json_str);
	// 1 先从json中提取数值
	cJSON *root = cJSON_Parse(json_str);
	if(root == NULL)
	{
		log_error("json解析失败");
		return -1;
	}
	cJSON *conn_type_cjson= cJSON_GetObjectItem(root, "conn_type");
	cJSON *id_cjson= cJSON_GetObjectItem(root, "id");
	cJSON *msg_cjson= cJSON_GetObjectItem(root, "msg");
	if(conn_type_cjson == NULL || id_cjson == NULL || msg_cjson == NULL)
	{
		log_error("json 值解析失败");
		return -1;
	}

	char conn_type= conn_type_cjson->valueint;
	char *id_hexstr= id_cjson->valuestring;
	char *msg_hexstr= msg_cjson->valuestring;

	int id_len=strlen(id_hexstr)/2;
	char id_bytes[id_len];

	int msg_len=strlen(msg_hexstr)/2;
	char msg_bytes[msg_len];

	//16字符串转字节数组
	id_len=app_common_hexstr2bytes(id_hexstr,id_bytes,id_len);
	msg_len=app_common_hexstr2bytes(msg_hexstr,msg_bytes,msg_len);

	int data_len=id_len+msg_len+3;
	if(buff_len<data_len)
	{
		log_error(" 缓冲区空间不足 ");
		return -1;
	}
	//组合完整的字节数组
	bytes_buff[0]=conn_type;
	bytes_buff[1]=id_len;
	bytes_buff[2]=msg_len;
	memcpy(bytes_buff+3,id_bytes,id_len);
	memcpy(bytes_buff+3+id_len,msg_bytes,msg_len);

	return data_len;
}